home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
X User Tools
/
X User Tools (O'Reilly and Associates)(1994).ISO
/
sources
/
xman
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-09-27
|
9KB
|
244 lines
/*
* xman - X window system manual page display program.
*
* $XConsortium: main.c,v 1.21 91/09/03 18:16:55 dave Exp $
*
* Copyright 1987, 1988 Massachusetts Institute of Technology
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted, provided
* that the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of M.I.T. not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. M.I.T. makes no representations about the
* suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* Author: Chris D. Peterson, MIT Project Athena
* Created: October 22, 1987
*/
#include "globals.h"
#ifndef ZERO
#include <X11/Xaw/Cardinals.h>
#endif /* ZERO */
#if ( !defined(lint) && !defined(SABER)) /* Version can be retrieved */
static char version[] = XMAN_VERSION; /* via strings. */
#endif
static void ArgError();
#define Offset(field) (XtOffsetOf(Xman_Resources , field))
static XtResource my_resources[] = {
{"directoryFontNormal", XtCFont, XtRFontStruct, sizeof(XFontStruct *),
Offset(fonts.directory), XtRString, DIRECTORY_NORMAL},
{"bothShown", XtCBoolean, XtRBoolean, sizeof(Boolean),
Offset(both_shown_initial), XtRString, "False"},
{"directoryHeight", "DirectoryHeight", XtRInt, sizeof(int),
Offset(directory_height), XtRString, "150"},
{"topCursor", XtCCursor, XtRCursor, sizeof(Cursor),
Offset(cursors.top), XtRString, XMAN_CURSOR},
{"helpCursor", XtCCursor, XtRCursor, sizeof(Cursor),
Offset(cursors.help), XtRString, HELP_CURSOR},
{"manpageCursor", XtCCursor, XtRCursor, sizeof(Cursor),
Offset(cursors.manpage), XtRString, MANPAGE_CURSOR},
{"searchEntryCursor", XtCCursor, XtRCursor, sizeof(Cursor),
Offset(cursors.search_entry), XtRString, SEARCH_ENTRY_CURSOR},
{"pointerColor", XtCForeground, XtRPixel, sizeof(Pixel),
Offset(cursors.fg_color), XtRString, "XtDefaultForeground"},
{"pointerColorBackground", XtCBackground, XtRPixel, sizeof(Pixel),
Offset(cursors.bg_color), XtRString, "XtDefaultBackground"},
{"help", XtCBoolean, XtRBoolean, sizeof(Boolean),
Offset(show_help_syntax), XtRImmediate, FALSE},
{"helpFile", XtCFile, XtRString, sizeof(char *),
Offset(help_file), XtRString, HELPFILE},
{"topBox", XtCBoolean, XtRBoolean, sizeof(Boolean),
Offset(top_box_active), XtRString, "True"},
{"clearSearchString", "ClearSearchString", XtRBoolean, sizeof(Boolean),
Offset(clear_search_string), XtRImmediate, (caddr_t) TRUE},
{"title", XtCString, XtRString, sizeof(char *),
Offset(title), XtRString, "xman"},
{"iconic", XtCBoolean, XtRBoolean, sizeof(Boolean),
Offset(iconic), XtRString, "False"},
};
#undef Offset
/*
* The resource that we absolutely need.
*/
static char * fallback_resources[] = { "Xman*quitButton.translations: #override \\n <Btn1Up>: Quit() reset()",
"Xman*helpButton.sensitive: FALSE",
"Xman*manpageButton.sensitive: FALSE",
"Xman*helpButton.Label: Help",
"Xman*quitButton.Label: Quit",
"Xman*manpageButton.Label: Manual Page",
"Xman*topLabel.label: No App-Defaults File",
NULL,
};
/*
* This is necessary to keep all TopLevel shells from becoming
* the size that is specified on the command line.
*/
static XrmOptionDescRec xman_options[] = {
{"-geometry", "*topBox.geometry", XrmoptionSepArg, (caddr_t) NULL},
{"-help", "help", XrmoptionNoArg, (caddr_t) "True"},
{"=", "*topBox.geometry", XrmoptionIsArg, (caddr_t) NULL},
{"-pagesize", "*manualBrowser.geometry", XrmoptionSepArg, (caddr_t) NULL},
{"-notopbox", "topBox", XrmoptionNoArg, (caddr_t) "False"},
{"-helpfile", "helpFile", XrmoptionSepArg, (caddr_t) NULL},
{"-bothshown","bothShown", XrmoptionNoArg, (caddr_t) "True"},
{"-title", "title", XrmoptionSepArg, (caddr_t) "xman"},
{"-iconic", "iconic", XrmoptionNoArg, (caddr_t) "True"},
};
XtActionsRec xman_actions[] = {
{"GotoPage", GotoPage},
{"Quit", Quit},
{"Search", Search},
{"PopupHelp", PopupHelp},
{"PopupSearch", PopupSearch},
{"CreateNewManpage", CreateNewManpage},
{"RemoveThisManpage", RemoveThisManpage},
{"SaveFormattedPage", SaveFormattedPage},
{"ShowVersion", ShowVersion},
};
char **saved_argv;
int saved_argc;
/* Function Name: main
* Description: This is the main driver for Xman.
* Arguments: argc, argv - the command line arguments.
* Returns: return, what return.
*/
void
main(argc,argv)
char ** argv;
int argc;
{
XtAppContext app_con;
saved_argc = argc;
saved_argv = (char **)XtMalloc(argc * sizeof(char *));
bcopy(argv, saved_argv, argc * sizeof(char *));
initial_widget = XtAppInitialize(&app_con, "Xman", xman_options,
XtNumber(xman_options), &argc, argv,
fallback_resources, NULL, ZERO);
manglobals_context = XStringToContext(MANNAME);
XtGetApplicationResources( initial_widget, (caddr_t) &resources,
my_resources, XtNumber(my_resources),
NULL, (Cardinal) 0);
if ( (argc != 1) || (resources.show_help_syntax) ) {
ArgError(argc, argv);
exit(1);
}
XtAppAddActions(app_con, xman_actions, XtNumber(xman_actions));
if (!resources.fonts.directory)
PrintError("Failed to get the directory font.");
#ifdef DEBUG
printf("debugging mode\n");
#endif
/*
* Set the default width and height.
* I am not real happy with this method, but it will usually do something
* reasonable, if not the "right" thing. It is not a real big issue since
* it is easy to change the values with resources or command line options.
* NOTE: if you are in a 100 dpi display you will lose.
*/
default_width = DEFAULT_WIDTH;
default_height=DisplayHeight(XtDisplay(initial_widget),
XtDisplay(initial_widget)->default_screen);
default_height *= 3;
default_height /= 4;
if ( (sections = Man()) == 0 )
PrintError("There are no manual sections to display, check your MANPATH.");
if (resources.top_box_active)
MakeTopBox();
else
(void) CreateManpage(NULL);
/*
* We need to keep track of the number of manual pages that are shown on
* the screen so that if this user does not have a top box then when he
* removes all his manual pages we can kill off the xman process.
* To make things easier we will consider the top box a shown manual page
* here, but since you cannot remove it, man_page_shown only goes to zero when
* no top box is present.
*/
man_pages_shown = 1;
XtAppMainLoop(app_con);
}
/* Function Name: ArgError
* Description: Prints error message about unknow arguments.
* Arguments: argc, argv - args not understood.
* Returns: none.
*/
static void
ArgError(argc, argv)
char ** argv;
int argc;
{
int i;
static char **syntax, *syntax_def[] = {
"-help", "Print this message",
"-helpfile <filename>", "Specifies the helpfile to use.",
"-bothshown", "Show both the directory and manpage at once.",
"-notopbox", "Starts with manpage rather than topbox.",
"-geometery <geom>", "Specifies the geometry of the top box.",
"=<geom>", "Specifies the geometry of the top box.",
"-pagesize <geom>", "Specifies the geometry of the manual page.",
"-bw <pixels>", "Width of all window borders.",
"-borderwidth <pixels>", "Width of all window borders.",
"-bd <color>", "Color of all window borders.",
"-bordercolor <color>", "Color of all window borders.",
"-fg <color>", "Foreground color for the application.",
"-foreground <color>", "Foreground color for the application.",
"-bg <color>", "Background color for the application.",
"-background <color>", "Background color for the application.",
"-display <display name>", "Specify a display that is not the default",
"-fn <font>", "Font to be used for button and label text.",
"-font <font>", "Font to be used for button and label text.",
"-name <name>", "Change the name used for retrieving resources.",
"-title <name>", "Change the name without affecting resources.",
"-xrm <resource>", "Specifies a resource on the command line.",
NULL, NULL,
};
syntax = syntax_def;
for (i = 1; i < argc ; i++)
(void) printf("This argument is unknown to Xman: %s\n", argv[i]);
(void) printf("\nKnown arguments are:\n");
while ( *syntax != NULL ) {
printf("%-30s - %s\n", syntax[0], syntax[1]);
syntax += 2;
}
}